package com.sharing.backgroundmodule.controller;

import com.sharing.backgroundmodule.dto.AreaDto;
import com.sharing.backgroundmodule.dto.RetentionRate;
import com.sharing.backgroundmodule.service.UserStatisticsService;
import com.sharing.common.Result;
import org.apache.tomcat.util.http.fileupload.util.LimitedInputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.*;
import java.lang.annotation.Retention;
import java.util.List;

/**
 * @author MingTian
 * @version 1.0
 * @description TODO 在后台模块中，针对用户注册数、每日网站访问量、用户登录量、用户作品发布情况、用户年龄分布情况、用户所属地区分布情况、
 * TODO 用户留存率等数据进行查询分析
 * @date 2023/6/11 21:24
 */
@RestController
@RequestMapping("/userStatistics")
public class UserStatisticsController {
    @Autowired
    private UserStatisticsService userStatisticsService;

    /**
     * 查询用户的注册数
     * @return
     */
    @GetMapping("/userRegistrationNumbers")
    public Result<Integer> selectUserRegistrationNumbers() {
        return userStatisticsService.selectUserRegistrationNumbers();
    }

    /**
     * 网站的的单日访问量
     * @param duration 日期范围，若 duration = 1 即代表只需要今日的访问量，若 duration = 7 即代表最近一周的访问量
     * @return
     */
    @GetMapping("/visitsNumbers")
    public Result<List<Long>> selectVisitsNumbers(Integer duration) {
        return userStatisticsService.selectVisitsNumbers(duration);
    }

    /**
     * 网站的单日用户登录量
     * @param duration 日期范围
     * @return
     */
    @GetMapping("/userNumber")
    public Result<List<Long>> selectUserNumber(Integer duration) {
        return userStatisticsService.selectUserNumber(duration);
    }

    /**
     * 用户作品发布情况
     * 由前端所传入的 thresholds 划分作品数量区间，统计每个用户在指定时间范围内所发布的作品数量，最终统计每个区间的用户数
     * @param thresholds 作品数量临界值集合
     * @param duration 指定的时间范围
     * @return
     */
    @GetMapping("userNumberByProduction")
    public Result<List<Integer>> selectUserNumberByProduction(@RequestParam List<Integer> thresholds, Integer duration) {
        return userStatisticsService.selectUserNumberByProduction(thresholds, duration);
    }

    /**
     * 用户年龄分布情况
     * 由前端所传入的 thresholds 划分用户数量区间，统计每个用户在指定时间范围内注册的用户数量，最终统计每个区间的用户数
     * @param thresholds 用户数量临界值集合
     * @param duration 指定的时间范围
     * @return
     */
    @GetMapping("/userNumberByAge")
    public Result<List<Integer>> selectUserNumberByAge(@RequestParam List<Integer> thresholds, Integer duration) {
        return userStatisticsService.selectUserNumberByAge(thresholds, duration);
    }

    /**
     * 用户所属地区分布情况
     * @param duration 指定的时间范围
     * @return
     */
    @GetMapping("/userNumberByArea")
    public Result<List<AreaDto>> selectUserNumberByArea(Integer duration) {
        return userStatisticsService.selectUserNumberByArea(duration);
    }

    /**
     * 新增用户数
     * @param duration 指定的时间范围
     * @return
     */
    @GetMapping("/newUserNumber")
    public Result<List<Integer>> selectNewUserNumber(Integer duration) {
        return userStatisticsService.selectNewUserNumber(duration);
    }

    /**
     * 用户留存率
     * @param endDate
     * @param duration
     * @return
     */
    @GetMapping("/retentionRate")
    public Result<List<RetentionRate>> selectRetentionRate(String endDate, Integer duration) {
        return userStatisticsService.selectRetentionRate(endDate, duration);
    }
}
